// encode UTF-8

// @Author        : Aged_cat
// @Date          : 2021-05-04


#ifndef HTTP_RESPONSE_H
#define HTTP_RESPONSE_H

#include <unordered_map>
#include <fcntl.h>  //open
#include <unistd.h> //close
#include <sys/stat.h> //stat
#include <sys/mman.h> //mmap,munmap
#include <assert.h>

#include "buffer.h"

class HTTPresponse
{
public:
    HTTPresponse();
    ~HTTPresponse();

    
    //初始化，绝对路径、请求url、是否长连接、http状态码
    void init(const std::string& srcDir,std::string& path,bool isKeepAlive=false,int code=-1);

    //往写入缓冲区里写入数据
    void makeResponse(Buffer& buffer);
    
    void unmapFile_();
    
    //获取文件
    char* file();
    //获取文件长度
    size_t fileLen() const;
    
    void errorContent(Buffer& buffer,std::string message);  //错误内容
    int code() const {return code_;}    //获取回复code


private:
    void addStateLine_(Buffer& buffer);
    void addResponseHeader_(Buffer& buffer);
    void addResponseContent_(Buffer& buffer);

    void errorHTML_();
    std::string getFileType_();

    int code_;
    bool isKeepAlive_;

    //请求路径
    std::string path_;
    //源文件路径
    std::string srcDir_;

    //文件映射
    char* mmFile_;
    //文件属性
    struct stat mmFileStat_;

    //页面种类
    static const std::unordered_map<std::string, std::string> SUFFIX_TYPE;
    //页面代码类型
    static const std::unordered_map<int, std::string> CODE_STATUS;
    //页面代码路径
    static const std::unordered_map<int, std::string> CODE_PATH;
    
};



#endif //HTTP_RESPONSE_H